package cn.tearcry.jsudoku;
/*
 * SudokuAction.java
 */
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;
/**
 *　实现ButtonAction接口，产生按钮按下的动作
 * @author 马建乐
 */
public class SudokuAction implements ButtonAction{
    /** 格子 */
    private GridButton button;
    /** 所有格子 */
    private GridButton[][] btnArray;
    /** 九宫格高亮颜色 */
    private static Color neighbourColor=new Color(168,211,115);
    /** 同一行高亮颜色 */
    private static Color rowColor=new Color(211,115,167);
    /** 同一列高亮颜色 */
    private static Color columnColor=new Color(115,165,211);
    /** 当前格子高亮色 */
    private static Color buttonColor=new Color(69,127,97);
    /** 高亮显示关 */
    public  static final boolean OFF=false;
    /** 高亮显示开 */
    public  static final boolean ON=true;
    
    private GridButtonFactory factory;
    /** 是否显示候选数 */
    private boolean displayAvailableNum;


   
    
    /**
     * 创建一个SudokuAction对象
     * @param GridButton 注册动作的按钮
     * @param GridButton[][] 按钮所在的整体
     * @param GridButtonFactory 代理对象
     */
    public SudokuAction(GridButton button,GridButton[][] btnArray,GridButtonFactory factory) {
        this.button=button;
        this.btnArray=btnArray;
        this.factory=factory;
    }
    
    /*
     * 恢复所有按钮的颜色 
     */
    
    public void clearAllColor() {
        //恢复所有按钮的初始颜色 
        for(int i=0;i<btnArray.length;i++) {
           for(int j=0;j<btnArray[i].length;j++)  { 
             btnArray[i][j].setBackground(GridButton.oriColor);             
            }
        }
        
    }
    
    
    /*
     *高亮显示按钮
     */
    private void highLighster() {
        
        
         //设置九宫格颜色
        int r=(int)button.getRow()/3;
        int c=(int)button.getColumn ()/3;
        for(int i=r*3;i<(r+1)*3;i++) {
            for(int j=c*3;j<(c+1)*3;j++) {
                if(i==button.getRow ()&&j==button.getColumn ()) {
                      btnArray[i][j].setBackground (buttonColor);
                    continue;
                }
               btnArray[i][j].setBackground(neighbourColor);
            }
        }
        //设置同一行颜色
        for(int i=0;i<btnArray[button.getRow()].length;i++) {
            if(i==button.getColumn ())
                continue;
        btnArray[button.getRow ()][i].setBackground(rowColor);          
        }
        
        //设置同一列颜色
        for(int i=0;i<btnArray[button.getRow()].length;i++) {  
            if(i==button.getRow ())
                continue;
           btnArray[i][button.getColumn()].setBackground(columnColor);
             
        }
    }
    
    public void setDisplayAvilableNum(boolean display) {
        displayAvailableNum=display;
    }
    
    public void doSomething() {
        clearAllColor();
        highLighster();              
      button.setBackground (buttonColor);
    }

    public void rightButtonAction (MouseEvent evt) {
        int mod=evt.getModifiers ();
        clearAllColor();
        highLighster();
       button.setBackground (buttonColor);
        if ((mod&InputEvent.BUTTON3_MASK)!=0) {           
            PopupMenu menu=new PopupMenu(button,btnArray,factory);  
           // menu.setDislayAvailableNum(displayAvailableNum,factory);
            if(menu.haveItems ())
               menu.show (button,evt.getX (),evt.getY ());
            return;            
        }
    }
}
